<?php
include "/home/u259796/common.sh.mymoni.ru/data/lib/php/path.php";
include "/home/u259796/common.sh.mymoni.ru/data/lib/php/resources.php";

$_ENCODING_ = array("1" => "KOI8-R", "2" => "WINDOWS-1251");


$today = getdate();

$lists = sql_select("select SUBSCRIBE_LIST_ID as ID, LANG_ID, SENDER_EMAIL, SENDER_NAME, EMAIL_SUBJECT, ".
		    "EMAIL_HEADER, EMAIL_FOOTER, PERIOD, START_DATE from SUBSCRIBE_LIST order by LIST_ORDER");

// цикл по листам подписки
foreach ($lists as $list_info) {
	$isInPeriod = 0;
	$contentForSend = array();

	// дата первой рассылки в формате YYYYMMDD
	$startDate = substr($list_info["START_DATE"], 0, 8);
	// дата запуска скрипта рассылки в формате YYYYMMDD
	$todayDate = sprintf("%4d%02d%02d", $today['year'], $today['mon'], $today['mday']);

	// ежедневная рассылка
	if ($list_info["PERIOD"] == 2) {
		$isInPeriod = $list_info["PERIOD"];
	}
	// еженедельная рассылка
	elseif ($list_info["PERIOD"] == 3) {
		// для вычисления еженедельного периода применяем простой метод:
		// 1. получаем день недели от даты первой рассылки
		// 2. получаем день недели даты запуска скрипта рассылки
		// 3. сравниваем обе даты и дни недели

		// получаем день недели даты первой рассылки
		$arr = getdate(mktime(0, 0, 0, substr($startDate, 4, 2), substr($startDate, 6), substr($startDate, 0, 4)));
		$startDateWday = $arr['wday'];
		// получаем день недели даты запуска скрипта рассылки
		$todayWday = $today['wday'];

		// сравниваем даты и дни недели
		if ($todayDate >= $startDate && $startDateWday == $todayWday) $isInPeriod = $list_info["PERIOD"];
	}
	// ежемесячная рассылка
	elseif ($list_info["PERIOD"] == 4) {
		// день месяца даты первой рассылки
		$startDateMday = substr($startDate, 6);

		// день месяца даты первой рассылки
		$todayMday = $today['mday'];
		$todayMonth = $today['mon'];

		if ($todayDate >= $startDate &&
			($startDateMday == $todayMday ||
			 ($todayMonth == 2 && $startDateMday > 28 && $todayMday == 29) ||
			 (($todayMonth == 4 || $todayMonth == 6 || $todayMonth == 9 || $todayMonth == 11) && $startDateMday == 31 && $todayMday == 30)
			)
		   ) $isInPeriod = $list_info["PERIOD"];
	}

	// если лист рассылки попадает в нужный период
	if ($isInPeriod) {
		// подпись со ссылками
		$signTmpl = get_url($list_info["ID"], $list_info["LANG_ID"]);

		$sendedContent = array();

		// выдергиваем список высланного контента
		$sended_ = sql_select("select SUBSCRIBE_LIST_ID SLID, CONTENT_ID CID, PRG_MODULE_ID PMID from SUBSCRIBE_SENDED_CONTENT ".
					"where SUBSCRIBE_LIST_ID = ".$list_info["ID"]);

		foreach ($sended_ as $rec) {
			$sendedContent[$rec["SLID"]."_".$rec["CID"]."_".$rec["PMID"]] = 1;
		}

		unset($sended_);

		// получаем параметры модулей контента по привязке листа рассылки к инф. блокам
		$moduleParams = sql_select("select distinct(PRG_MODULE.PRG_MODULE_ID) as PRG_MODULE_ID, PRG_MODULE.TABLE_NAME, ".
					   "lower(PRG_MODULE.CLASS_NAME) as CLASS_NAME from SUBSCRIBE_LIST_INF_BLOCK, INF_BLOCK, PRG_MODULE ".
					   "where SUBSCRIBE_LIST_INF_BLOCK.SUBSCRIBE_LIST_ID = ".$list_info["ID"].
					   " and SUBSCRIBE_LIST_INF_BLOCK.INF_BLOCK_ID = INF_BLOCK.INF_BLOCK_ID".
					   " and INF_BLOCK.PRG_MODULE_ID = PRG_MODULE.PRG_MODULE_ID ".
					   "order by PRG_MODULE.TABLE_NAME");

		// по каждому модулю выдергиваем неразосланный контент
		foreach ($moduleParams as $module) {
			// новости
			if ($module["CLASS_NAME"] == 'news') {
				// тянем из базы контент
				$availableContent =  sql_select("select ".$module["TABLE_NAME"].".CONTENT_ID, ".
								$module["TABLE_NAME"].".NEWS_DATE, ".$module["TABLE_NAME"].".TITLE, ".
								$module["TABLE_NAME"].".ANNOUNCE, SUBSCRIBE_LIST_INF_BLOCK.INF_BLOCK_ID ".
								"from ".$module["TABLE_NAME"].", CONTENT_MAP, SUBSCRIBE_LIST_INF_BLOCK ".
								"where ".$module["TABLE_NAME"].".VERSION = 0 and ".
								$module["TABLE_NAME"].".LANG_ID = ".$list_info["LANG_ID"].
								" and ".$module["TABLE_NAME"].".SEND_IT = 1".
								" and ".$module["TABLE_NAME"].".CONTENT_ID = CONTENT_MAP.CONTENT_ID".
								" and CONTENT_MAP.INF_BLOCK_ID = SUBSCRIBE_LIST_INF_BLOCK.INF_BLOCK_ID".
								" and SUBSCRIBE_LIST_INF_BLOCK.SUBSCRIBE_LIST_ID = ".$list_info["ID"].
								" order by ".$module["TABLE_NAME"].".NEWS_DATE desc");

				// проверяем его доступность на рассылку
				foreach ($availableContent as $availableRecord) {
					if (!$sendedContent[$list_info["ID"].'_'.$availableRecord["CONTENT_ID"].'_'.$module["PRG_MODULE_ID"]]) {
						$page_id = get_page_id($availableRecord["INF_BLOCK_ID"], $list_info["LANG_ID"], 0, $module["PRG_MODULE_ID"], $module["CLASS_NAME"]);

						if ($page_id) {
							// генерим ссылку на полную новость
							$availableRecord["URL"] = "http://".get_page_url($page_id, $availableRecord["INF_BLOCK_ID"], $list_info["LANG_ID"]).
										  "?id".get_tarea_id($page_id, $availableRecord["INF_BLOCK_ID"], $list_info["LANG_ID"])."=".$availableRecord["CONTENT_ID"];
							$contentForSend["news"][] = $availableRecord;

							// пишем в базу инфо об отправленном контенте
							insert_record('SUBSCRIBE_SENDED_CONTENT', array(
										array('name' => 'SUBSCRIBE_LIST_ID', 'value' => $list_info["ID"]),
										array('name' => 'CONTENT_ID', 'value' => $availableRecord["CONTENT_ID"]),
										array('name' => 'PRG_MODULE_ID', 'value' => $module["PRG_MODULE_ID"])
										)
									);

							$sendedContent[$list_info["ID"].'_'.$availableRecord["CONTENT_ID"].'_'.$module["PRG_MODULE_ID"]] = 1;
						}
					}
				}
			}
			// список
			else {
				// тянем из базы контент
				$availableContent =  sql_select("select ".$module["TABLE_NAME"].".CONTENT_ID, ".
								$module["TABLE_NAME"].".TITLE, ".$module["TABLE_NAME"].".BODY, ".
								"SUBSCRIBE_LIST_INF_BLOCK.INF_BLOCK_ID from ".$module["TABLE_NAME"].", CONTENT_MAP, SUBSCRIBE_LIST_INF_BLOCK ".
								"where ".$module["TABLE_NAME"].".VERSION = 0 and ".
								$module["TABLE_NAME"].".LANG_ID = ".$list_info["LANG_ID"].
								" and ".$module["TABLE_NAME"].".SEND_IT = 1".
								" and ".$module["TABLE_NAME"].".CONTENT_ID = CONTENT_MAP.CONTENT_ID".
								" and CONTENT_MAP.INF_BLOCK_ID = SUBSCRIBE_LIST_INF_BLOCK.INF_BLOCK_ID".
								" and SUBSCRIBE_LIST_INF_BLOCK.SUBSCRIBE_LIST_ID = ".$list_info["ID"].
								" order by ".$module["TABLE_NAME"].".LIST_ORDER desc");

				// проверяем его доступность на рассылку
				foreach ($availableContent as $availableRecord) {
					if (!$sendedContent[$list_info["ID"].'_'.$availableRecord["CONTENT_ID"].'_'.$module["PRG_MODULE_ID"]]) {
						$contentForSend["list"][] = $availableRecord;

						// пишем в базу инфо об отправленном контенте
						insert_record('SUBSCRIBE_SENDED_CONTENT', array(
									array('name' => 'SUBSCRIBE_LIST_ID', 'value' => $list_info["ID"]),
									array('name' => 'CONTENT_ID', 'value' => $availableRecord["CONTENT_ID"]),
									array('name' => 'PRG_MODULE_ID', 'value' => $module["PRG_MODULE_ID"])
									)
								);

						$sendedContent[$list_info["ID"].'_'.$availableRecord["CONTENT_ID"].'_'.$module["PRG_MODULE_ID"]] = 1;
					}
				}
			}
		}

		// рассылка
		if (count($contentForSend["news"]) > 0 || count($contentForSend["list"]) > 0) {
			// создаем объект 'шаблон'
			$tmpl = new vlibTemplate($common_data_server."module_templates/subscription/autosend.vtmpl");

			// парсим заголовки в шаблон
			$tmpl->setVar("EMAIL_HEADER", $list_info["EMAIL_HEADER"]);
			$tmpl->setVar("EMAIL_FOOTER", $list_info["EMAIL_FOOTER"]);

			// передадим LANG_ID в шаблон
			$tmpl->setVar("LANG_ID", $list_info["LANG_ID"]);

			// парсим контент модуля "список"
			if (count($contentForSend["list"]) > 0) $tmpl->setLoop("LIST", $contentForSend["list"]);

			// парсим контент модуля "новости"
			if (count($contentForSend["news"]) > 0) {
				$currentDate = "";

				$tmpl->newLoop("NEWS");
				foreach ($contentForSend["news"] as $news) {
					// группировка новостей по дате: если дата новости равна значению $current_date, то обнуляем $news["ANNOUNCE_DATE"], ...
					if ($current_date != $news["NEWS_DATE"]) {
						$current_date = $news["NEWS_DATE"];
						$news["DATE"] = unpack_date($news["NEWS_DATE"], "short");
					}
					// передадим LANG_ID в шаблон
					$news["LANG_ID"] = $list_info["LANG_ID"];
					$tmpl->addRow($news);
				}
				$tmpl->addLoop("NEWS");
			}

			// создаем объект 'письмо'
			$email = new vlibMimeMail;

			// читаем список подписчиков данного листа подписки
			$subscriber = sql_select("select SUBSCRIBER.FIO, SUBSCRIBER.EMAIL, SUBSCRIBER.ORGANIZATION, ".
						 "SUBSCRIBER.ENCODING, SUBSCRIBER.PASSWORD from SUBSCRIBER, SUBSCRIBER_SUBSCRIBE_LIST ".
						 "where SUBSCRIBER.SUBSCRIBER_ID = SUBSCRIBER_SUBSCRIBE_LIST.SUBSCRIBER_ID".
						 " and SUBSCRIBER_SUBSCRIBE_LIST.SUBSCRIBE_LIST_ID = ".$list_info["ID"].
						 " and SUBSCRIBER.ACTIVE = 1 and SUBSCRIBER.ACTIVE IS NOT NULL");

			if (count($subscriber) > 0) {
				// циклимся по списку и распихиваем каждому подписчику по 'письму'
				foreach ($subscriber as $recipient) {
					// копируем объекты шаблона письма и подписи
					$tmpl_copy = $tmpl;
					$signTmpl_copy = $signTmpl;

					// очищаем заголовки
					$email->clearAll();

					// шлепаем e-mail/имя получателя
					$email->to($recipient["EMAIL"], "=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'WINDOWS-1251')."?B?".base64_encode(convert_cyr_string($recipient["FIO"], 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");

					// шлепаем организацию получателя
					if ($recipient["ORGANIZATION"] != '') $email->organization("=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'WINDOWS-1251')."?B?".base64_encode(convert_cyr_string($recipient["ORGANIZATION"], 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");

					// шлепаем отправителя
					$email->from($list_info["SENDER_EMAIL"], "=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'WINDOWS-1251')."?B?".base64_encode(convert_cyr_string($list_info["SENDER_NAME"], 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");

					// шлепаем тему письма в 'письмо'
					$emailSubject = preg_replace("/<SUBSCRIBER_NAME>/", $recipient["FIO"], $list_info["EMAIL_SUBJECT"]);
					$email->subject("=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'WINDOWS-1251')."?B?".base64_encode(convert_cyr_string($emailSubject, 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");

					// шлепаем в шаблон url изменения параметров подписки
					// заменяем шаблонные значения PASSWORD и EMAIL на пароль и e-mail подписчика
					$signTmpl_copy->setVar("CGROUP_ID", $recipient["CGROUP_ID"]);
					$linkSign = preg_replace(array("/<PASSWORD>/", "/<EMAIL>/"), array(urlencode($recipient["PASSWORD"]), urlencode($recipient["EMAIL"])), $signTmpl_copy->grab());

					$emailBody = preg_replace("/<SUBSCRIBER_NAME>/", $recipient["FIO"], $tmpl_copy->grab().$linkSign);
					$emailBody = encode_special_chars($emailBody);
					$email->htmlBody(convert_cyr_string($emailBody, 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]), strtolower($_ENCODING_[$recipient["ENCODING"]]));

					// отправляем письму юзверю и ... все сначала
					$email->send();
				}

				// пишем историю в базу
				insert_record('SUBSCRIBE_ARCHIVE', array(
									array('name' => 'SUBSCRIBE_LIST_ID', 'value' => $list_info["ID"]),
									array('name' => 'LANG_ID', 'value' => $list_info["LANG_ID"]),
									array('name' => 'EMAIL_SUBJECT', 'value' => $list_info["EMAIL_SUBJECT"]),
									array('name' => 'EMAIL_BODY', 'value' => $tmpl->grab().$signature),
									array('name' => 'EMAIL_DATETIME', 'value' => pack_date(date("d.m.Y H:i"), "long"))
									)
						);
			}
		}
	}
}


function get_page_id($block_id, $lang_id, $is_main, $prg_module_id = 0, $class_name = '') {
	$page_id = sql_select("select PA.PAGE_ID from PAGE_AREA PA, TEMPLATE_AREA TA, PAGE P".
				($class_name == 'news' ? ", PAGE_AREA_PARAM PAP, MODULE_PARAM MP" : "").
				" where PA.INF_BLOCK_ID = ".$block_id.
				" and PA.TEMPLATE_AREA_ID = TA.TEMPLATE_AREA_ID ".($is_main ? " and TA.IS_MAIN = 1 " : "").
				" and PA.VERSION = 0 and PA.PAGE_ID = P.PAGE_ID and P.LANG_ID = ".$lang_id.
				($class_name == 'news' ? " and PA.PAGE_ID = PAP.PAGE_ID and PAP.VERSION = 0".
							" and PA.TEMPLATE_AREA_ID = PAP.TEMPLATE_AREA_ID".
							" and PAP.MODULE_PARAM_ID = MP.MODULE_PARAM_ID".
							" and MP.PRG_MODULE_ID = ".$prg_module_id." and P.IS_FOLDER <> 1"
						      : ""));
	return $page_id[0][0];
}

function get_page_url($page_id, $block_id, $lang_id) {
	if ($page_id && $block_id) {
		$page_row = sql_select("SELECT P.PARENT_ID, P.DIR_NAME, S.HOST FROM PAGE P, PAGE_AREA PA, SITE S ".
					"WHERE PA.PAGE_ID = ".$page_id." AND PA.INF_BLOCK_ID = ".$block_id.
					" AND PA.PAGE_ID = P.PAGE_ID AND PA.VERSION = P.VERSION AND PA.VERSION = 0".
					" AND P.LANG_ID = ".$lang_id." AND P.SITE_ID = S.SITE_ID");
		$parent = $page_row[0]["PARENT_ID"];
		$redir_path = $page_row[0]["DIR_NAME"]."/";
		while ($parent != 0) {
			$parent_rows = sql_select("SELECT PARENT_ID, DIR_NAME FROM PAGE WHERE PAGE_ID = ".$parent.
							" and LANG_ID = ".$lang_id." and VERSION = 0");
			$redir_path = $parent_rows[0]["DIR_NAME"] . "/" . $redir_path;
			$parent = $parent_rows[0]["PARENT_ID"];
		}
		$redir_path = $page_row[0]["HOST"]."/".$redir_path;
	}

	return $redir_path."index.php";
}

function get_tarea_id($page_id, $inf_block_id, $lang_id) {
	if ($page_id) {
		$tarea_arr = sql_select("select PA.TEMPLATE_AREA_ID as TAREA_ID from PAGE_AREA PA, TEMPLATE_AREA TA, PAGE P ".
					"where PA.PAGE_ID = ".$page_id." and PA.VERSION = 0 and PA.INF_BLOCK_ID = ".$inf_block_id.
					" and PA.PAGE_ID = P.PAGE_ID and P.LANG_ID = ".$lang_id." and PA.TEMPLATE_AREA_ID = TA.TEMPLATE_AREA_ID ".
					"order by TA.IS_MAIN desc");
		$tarea_id = $tarea_arr[0]['TAREA_ID'];
	}

	return $tarea_id;
}


function get_url($listID, $langID) {
	global $common_data_server;

	$output = array();

	$tmpl = new vlibTemplate();
	$tmpl->newTemplate($common_data_server."module_templates/subscription/links_signature.vtmpl");
	$tmpl->setVar("LANG_ID", $langID);

	// выборка сайтов
	$sites = sql_select("select S.SITE_ID, S.HOST from SUBSCRIBE_LIST_SITE SLS, SITE S ".
			"where SLS.SUBSCRIBE_LIST_ID = ".$listID." and SLS.SITE_ID = S.SITE_ID order by S.HOST");

	foreach ($sites as $site) {
		$TAREA_ID = '';
		$PATH = array();

		$page = sql_select("select P.PARENT_ID, P.DIR_NAME, PA.TEMPLATE_AREA_ID ".
				"from PAGE P, PAGE_AREA PA, INF_BLOCK IB, PRG_MODULE PM, TEMPLATE_AREA TA ".
				"where P.SITE_ID = ".$site["SITE_ID"]." and P.LANG_ID = ".$langID." and P.VERSION = 0 ".
				" and P.PAGE_ID = PA.PAGE_ID and PA.VERSION = 0 and PA.INF_BLOCK_ID = IB.INF_BLOCK_ID ".
				" and IB.PRG_MODULE_ID = PM.PRG_MODULE_ID and PM.CLASS_NAME = 'subscription' ".
				" and PA.TEMPLATE_AREA_ID = TA.TEMPLATE_AREA_ID and TA.IS_MAIN = 1");

		if (count($page) > 0) {
			$TAREA_ID = $page[0]["TEMPLATE_AREA_ID"];
			$PATH[] = $page[0]["DIR_NAME"];
			$parent = $page[0]["PARENT_ID"];

			while ($parent != 0) {
				$parent_rows = sql_select("SELECT PARENT_ID, DIR_NAME FROM PAGE WHERE PAGE_ID = ".$parent);
				$PATH[] = $parent_rows[0]["DIR_NAME"];
				$parent = $parent_rows[0]["PARENT_ID"];
			}

			$output[] = array('URL'  => "http://".$site["HOST"]."/".implode("/", array_reverse($PATH)).
						   "/index.php?action".$TAREA_ID."=subscribe_change&pwd".$TAREA_ID."=<PASSWORD>".
						   "&email".$TAREA_ID."=<EMAIL>",
					  'HOST' => $site["HOST"]);
		}
	}

	if (count($output) > 0) $tmpl->setLoop("SITE_LIST", $output);

	return $tmpl;
}


function encode_special_chars($src_text) {
	$search  = array("'".chr(145)."'", "'".chr(146)."'", "'".chr(147)."'",
			 "'".chr(148)."'", "'".chr(171)."'", "'".chr(185)."'",
			 "'".chr(187)."'");
	$replace = array("&#145;", "&#146;", "&#147;", "&#148;", "&#171;", "&#185;", "&#187;");

	return(preg_replace ($search, $replace, $src_text));
}
?>
